import pandas as pd
import numpy as np

# metaclass 可以像装饰器那样定制和修改继承它的子类
# 现在你有 1 万个不同格式的 YAML 配置文件，本来你需要写 1 万个类来加载这些配置文件，
# 有了 metaclass，你只需要实现一个 metaclass 超类，
# 然后再实现一个子类继承这个 metaclass，
# 就可以根据不同的配置文件自动拉取不同的类，这极大地提高了效率。
class Mymeta(type):
   def __init__(self, name, bases, dic):
       super().__init__(name, bases, dic)
       print('===>Mymeta.__init__')
       print(self.__name__)
       print(dic)
       print(self.yaml_tag)

   def __new__(cls, *args, **kwargs):
       print('===>Mymeta.__new__')
       print(cls.__name__)
       return type.__new__(cls, *args, **kwargs)

   def __call__(cls, *args, **kwargs):
       print('===>Mymeta.__call__')
       obj = cls.__new__(cls)
       cls.__init__(cls, *args, **kwargs)
       return obj

class Foo(metaclass=Mymeta):
    yaml_tag = '!Foo'

    def __init__(self, name):
        print('Foo.__init__')
        self.name = name

    def __new__(cls, *args, **kwargs):
        print('Foo.__new__')
        return object.__new__(cls)

foo = Foo('foo')
# 在定义 class Foo() 定义时，会依次调用 MyMeta 的 __new__ 和 __init__ 方法构建 Foo 类
# 然后在调用 foo = Foo() 创建类的实例对象时，
# 才会调用 MyMeta 的 __call__ 方法来调用 Foo 类的 __new__ 和 __init__ 方法

data = np.array([[1,2]])
dd = pd.DataFrame.from_records(data, columns=['col_1', 'col_2'])
print(dd)